/*
 * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2023-2023. All rights reserved.
 */

#ifndef __LIBMAIN_H__
#define __LIBMAIN_H__

/*****************************************************************************/
/*  本文件需要包含的其他头文件依赖                                           */
/*****************************************************************************/
#include "minwindef.h"
#include "winsock2.h"
#include "iptypes.h"

#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */


/*****************************************************************************/
/*  宏开关定义（例如可能的编译、调试、打印开关）                             */
/*****************************************************************************/

/*****************************************************************************/
/*  宏常量定义                                                               */
/*****************************************************************************/

#define TTL_VALUE 3
#define INVALID_IP "0.0.0.0"
#define TEST_PORT 3456
#define MULTICAST_PORT 13456

#define MAX_NETCARD_DESCRIPTION_LEN 88
#define MAX_NETCARD_NUM 10
#define DESCRIPTION_PACKET_BODY_LEN 8
#define PACKET_HEAD_LEN 12
#define NETCARD_DESCRIPTION_INFO 45
#define NETCARD_IP_LEN 16
#define DESCRIPTION_STRING_LEN (22 + 20)


#define LANGUAGE_ENGLISH  0
#define LANGUAGE_CHINESE  1

#define MAX_PKG_ID_LEN           22
#define MAX_PRODUCT_ID_LEN       20
#define MAX_FILE_ONE_LINE_LEN    512
#define MAX_FILE_PATH            2048 /* 最大路径长度 */
#define ONE_SEGMENT_BUFF_LEN     1024
#define ONE_PACKET_BUFF_LEN      (ONE_SEGMENT_BUFF_LEN + 62)
#define INTERVAL_TIME_LEN        15
#define PARTITION_MAX            32

#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cpluscplus */
#endif /* __cpluscplus */

namespace LibMainClass {
class LibMain {
public:
    struct PATITION {
        unsigned char  partitionName[20];
        unsigned long  addrStart;
        unsigned long  addrEnd;
        unsigned long  cover;
    };

    struct GROUP_UPG_PACKAGE_ST {
        unsigned long ulPackageCrc;     // 该组播包的CRC校验值，包含组播包头和组播包的数据。
        unsigned long ulMagicNumber;    // 魔数字： 0xB0A555AA 。
        unsigned char ucPackageType;   // 标识组播包类型。
        // 1: 表示该组播包中数据为射频板升级包数据，
        // 2    ：表示该组播包中数据为网关板升级包数据，
        // 3    ：表示该组播包中数据为网关板小系统升级包数据，
        // 4    ：表示该组播包中数据为Modem升级包数据，
        unsigned char ucPolicy;
        // 1：表示网关和射频板同时升级    全升:   现在改成了5
        // 2: 表示只升级射频板        modem:  现在改成了6
        // 3: 表示只升级网关板        router: 现在仍然是3
        unsigned short usReserved1;         // 保留字段1
        unsigned long ulSerialNumber;       // 该组播包的序号(0,1,2,3,4,5,6,7,…….)
        unsigned long ulTotalPackageNum;    // 该类型(射频或者网关)组播包的总个数。
        unsigned long ulPackageSize;        // 该组播包数据的大小，除掉该组播包头。
        unsigned long ulImageSize;          // 该类型(射频或者网关)映像文件的总长度
        unsigned long ulReserved2;          // 保留字段2
    };

    static char netcardList[MAX_NETCARD_NUM][MAX_NETCARD_DESCRIPTION_LEN + 1];
    static char netcardIP[NETCARD_IP_LEN];
    static BOOL bIsSendingPack;
    static unsigned long ulSendImgFileNum;
    static unsigned long ulImgFileLen;
    static unsigned long ulRetCode;
    static struct in_addr stTargetMulticastIP;
    static unsigned long ulStopFlag;
    static char pszImgFileName[MAX_FILE_PATH + 1];
    static char pszIniFileName[MAX_FILE_PATH + 1];
    static char pszOneSegmentBuff[ONE_SEGMENT_BUFF_LEN + 1];
    static char pszMulticastIp[NETCARD_IP_LEN];
    static char pszIntervalTime[INTERVAL_TIME_LEN];
    static unsigned int ulUpgPolicy;
    static unsigned long ulPacketNo; /* 发包顺序号 */
    static char pszPacketBuff[ONE_PACKET_BUFF_LEN];
    static PATITION stPatitions[PARTITION_MAX];
    static char pszPkgIDValue[MAX_PKG_ID_LEN + 1];
    static char pszProductIDValue[MAX_PRODUCT_ID_LEN + 1];
    static char pszFileOneLineBuff[MAX_FILE_ONE_LINE_LEN + 1];
    static char filetypeDescribe; /* 包含的文件类型描述位 */
    static unsigned long ulImgFileCRC;
    static GROUP_UPG_PACKAGE_ST stMultiHGWHead;

    static unsigned long CopyNetCard(PIP_ADAPTER_INFO &pTmpAdapterInfo);
    static unsigned long MutGetAllNetworkCard();
    static unsigned long MutWinsockDeInit(SOCKET stSocket);
    static unsigned long MutGetSelNetCardIP(unsigned long ulNetworkCardNo);
    static unsigned long MutWinsockInit(SOCKET &hSocket, const char *sInterfaceIPAddress);
    static unsigned long MutSendPacket(SOCKET arg);
    static unsigned long AddMulticastGroup(long ulTmp, SOCKET &hSocket, unsigned long ulAddr);
    static DWORD TspMutMulticast(LPVOID pNetCardNo);
};
}
#endif  /* __LIBMAIN_H__ */
